<?php

namespace ajiho\helper;

class Algo
{


    /**
     * 无限极分类排序
     * @param array $data
     * @param string $self_field_name 自身标记字段
     * @param string $parent_field_name parent标记字段
     * @param int $parent_field_value parent标记字段值初始值
     * @param string $level_field_name 层级标记字段
     * @param int $level_field_value 层级标记字段初始值
     * @return array
     */
    public static function ruleList(array $data, string $self_field_name = 'id', string $parent_field_name = 'pid', int $parent_field_value = 0, string $level_field_name = 'level', int $level_field_value = 0): array
    {
        static $arr = [];
        foreach ($data as $val) {
            if ($parent_field_value == $val[$parent_field_name]) {
                $val[$level_field_name] = $level_field_value;
                $arr[] = $val;
                self::ruleList($data, $self_field_name, $parent_field_name, $val[$self_field_name], $level_field_name, $val[$level_field_name] + 1);
            }
        }
        return $arr;
    }


    /**
     * 生成树结构数据
     * @param array $data
     * @param string $self_field_name
     * @param string $parent_field_name
     * @param int $parent_field_value
     * @param string $children_field_name
     * @return array
     */
    public static function getTree(array $data,string $self_field_name = 'id', string $parent_field_name = 'pid', int $parent_field_value = 0, string $children_field_name = 'children'): array
    {
        // 返回的结果
        $arr = [];
        foreach ($data as $val) {
            // 给定的PID是当前记录的上级ID
            if ($val[$parent_field_name] == $parent_field_value) {
                // 递归
                $val[$children_field_name] = self::getTree($data,$self_field_name, $parent_field_name, $val[$self_field_name], $children_field_name);
                $arr[] = $val;
            }
        }
        return $arr;
    }


    /**
     * 通过指定key值查找子集
     * @param array $list
     * @param mixed $search_key 用于查找的key,默认搜索的字段名称为 'id'
     * @param bool $include_self 是否需要包含自身
     * @param string $search_key_name 搜索的字段名称
     * @param string $p_field 父级的字段名称
     * @return array
     */
    public static function getChildren(array $list, $search_key, bool $include_self = true, string $search_key_name = 'id', string $p_field = 'pid'): array
    {

        static $temp = [];

        foreach ($list as $row) {

            if ($include_self === true) {
                //找到当前搜索的类
                if ($row[$search_key_name] == $search_key) {
                    $include_self = false;
                    $temp[] = $row;
                }
            }

            if ($row[$p_field] == $search_key) {//如果相等则表示找到
                //把满足条件的给装进容器
                $temp[] = $row;

                //再次递归调用
                self::getChildren($list, $row[$search_key_name], false, $search_key_name, $p_field);
            }
        }
        return $temp;
    }


    /**
     * @param array $data
     * @param mixed $search_key 用于查找的key,默认搜索的字段名称为 'id'
     * @param int $level 搜索层级
     * @param bool $include_self 搜索结果是否包含自身
     * @param string $p_field 父级字段名称
     * @param string $search_key_name 搜索字段名称
     * @param mixed $search_end_value 停止搜索的值
     * @return array
     */
    public static function getParent(array $data, $search_key, int $level = -1, bool $include_self = false, string $p_field = 'pid', string $search_key_name = 'id', $search_end_value = 0): array
    {
        $temp = [];
        $i = 0;
        while ($search_key != $search_end_value) {

            if ($level !== -1 && $i > $level) {
                break;
            }
            $i++;
            foreach ($data as $item) {
                if ($item[$search_key_name] == $search_key) {
                    $temp[] = $item;
                    if ($include_self === false) {
                        $include_self = true;
                        array_shift($temp);
                    }
                    $search_key = $item[$p_field];
                    break;
                }
            }
        }

        return array_reverse($temp);
    }

}